#include "gtkwindow.h"
#include "gtknative.h"
#include "gtkgestureclick.h"
+#include "gtkdragsource.h"
+#include "gtkwidgetpaintable.h"
#include "a11y/gtkentryaccessible.h"
guint in_drag : 1;
GdkDragAction actions;
- GdkContentFormats *target_list;
+ GdkContentProvider *content;
};
enum {
if (icon_info == NULL)
continue;
- if (icon_info->target_list != NULL)
- gdk_content_formats_unref (icon_info->target_list);
+ g_clear_object (&icon_info->content);
gtk_widget_unparent (icon_info->widget);
pos = get_icon_position_from_controller (entry, GTK_EVENT_CONTROLLER (gesture));
icon_info = priv->icons[pos];
- if (icon_info->target_list != NULL &&
- gtk_drag_check_threshold (icon_info->widget,
- start_x, start_y,
- x, y))
+ if (icon_info->content != NULL &&
+ gtk_drag_check_threshold (icon_info->widget, start_x, start_y, x, y))
{
+ GtkDragSource *source;
+ GdkPaintable *paintable;
+ GdkDevice *device;
+
icon_info->in_drag = TRUE;
- gtk_drag_begin (GTK_WIDGET (entry),
- gtk_gesture_get_device (GTK_GESTURE (gesture)),
- icon_info->target_list,
- icon_info->actions,
- start_x, start_y);
+ source = gtk_drag_source_new (icon_info->content, icon_info->actions);
+ paintable = gtk_widget_paintable_new (icon_info->widget);
+ gtk_drag_source_set_icon (source, paintable, -2, -2);
+ g_object_unref (paintable);
+ device = gtk_gesture_get_device (GTK_GESTURE (gesture));
+ gtk_drag_source_drag_begin (source, GTK_WIDGET (entry), device, start_x, start_y);
+ g_object_unref (source);
}
}
void
gtk_entry_set_icon_drag_source (GtkEntry *entry,
GtkEntryIconPosition icon_pos,
- GdkContentFormats *formats,
+ GdkContentProvider *provider,
GdkDragAction actions)
{
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
if ((icon_info = priv->icons[icon_pos]) == NULL)
icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos);
- if (icon_info->target_list)
- gdk_content_formats_unref (icon_info->target_list);
- icon_info->target_list = formats;
- if (icon_info->target_list)
- gdk_content_formats_ref (icon_info->target_list);
-
+ g_set_object (&icon_info->content, provider);
icon_info->actions = actions;
}
gtk_drag_set_icon_name (drag, "dialog-information", 2, 2);
}
-static void
-drag_data_get_cb (GtkWidget *widget,
- GdkDrag *drag,
- GtkSelectionData *data,
- gpointer user_data)
-{
- gint pos;
-
- pos = gtk_entry_get_current_icon_drag_source (GTK_ENTRY (widget));
-
- if (pos == GTK_ENTRY_ICON_PRIMARY)
- {
- gint start, end;
-
- if (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start, &end))
- {
- gchar *str;
-
- str = gtk_editable_get_chars (GTK_EDITABLE (widget), start, end);
- gtk_selection_data_set_text (data, str, -1);
- g_free (str);
- }
- else
- gtk_selection_data_set_text (data, "XXX", -1);
- }
-}
-
static void
set_blank (GtkWidget *button,
GtkEntry *entry)
GtkWidget *button3;
GtkWidget *button4;
GIcon *icon;
- GdkContentFormats *tlist;
+ GdkContentProvider *content;
+ GValue value = G_VALUE_INIT;
gtk_init ();
gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry),
GTK_ENTRY_ICON_PRIMARY,
"Save a file");
- tlist = gdk_content_formats_new (NULL, 0);
- tlist = gtk_content_formats_add_text_targets (tlist);
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, "Amazing");
+ content = gdk_content_provider_new_for_value (&value);
+ g_value_unset (&value);
gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
GTK_ENTRY_ICON_PRIMARY,
- tlist, GDK_ACTION_COPY);
+ content, GDK_ACTION_COPY);
g_signal_connect_after (entry, "drag-begin",
G_CALLBACK (drag_begin_cb), NULL);
- g_signal_connect (entry, "drag-data-get",
- G_CALLBACK (drag_data_get_cb), NULL);
- gdk_content_formats_unref (tlist);
+ g_object_unref (content);
/*
* Search - Uses a helper function